package com.example.diskfilesystem;

import com.example.diskfilesystem.directory.DirectoryEntry;
import com.example.diskfilesystem.directory.DirectoryManager;
import com.example.diskfilesystem.disk.Disk;
import com.example.diskfilesystem.disk.FATManager;
import com.example.diskfilesystem.file.FileManager;
import config.Config;
import javafx.geometry.Insets;
import javafx.geometry.Pos;
import javafx.scene.control.Button;
import javafx.scene.control.Label;
import javafx.scene.control.TreeItem;
import javafx.scene.control.TreeView;
import javafx.scene.layout.*;
import java.io.IOException;
import java.util.List;

public class DiskFileSystemUI {
    private Disk disk;
    private FATManager fat;
    private DirectoryManager dm;
    private BorderPane root;
    private TreeView<String> directoryTreeView;
    private FlowPane fileBrowserPane; // 用于显示文件和文件夹图面的面板
    private Label currentPathLabel;   // 显示当前路径的标签
    private Button monitorButton;   // 磁盘监视按钮
    private Button newFileButton;
    private Button newFolderButton;
    private FileManager fileManager;

    public DiskFileSystemUI(Disk disk, FATManager fat, DirectoryManager dm) {
        this.disk = disk;
        this.fat = fat;
        this.dm = dm;

        directoryTreeView = new TreeView<>();
        // 初始化文件浏览器面板
        fileBrowserPane = new FlowPane();
        currentPathLabel = new Label("当前位置: /");
        monitorButton = new Button("磁盘监视");
        newFileButton = new Button("新建文件");
        newFolderButton = new Button("新建文件夹");
        //创建顶部
        root = new BorderPane();
        root.setTop(createTop());
        root.setLeft(createLeft());
        root.setCenter(createCenter());


    }

    private Pane createTop() {
        // 1. 创建顶部工具栏容器
        HBox topToolBar = new HBox();
        topToolBar.setPadding(new Insets(10, 15, 10, 15));
        topToolBar.setSpacing(20);
        topToolBar.setStyle("-fx-background-color: #e9ecef; -fx-border-color: #dee2e6; -fx-border-width: 0 0 1 0;");

        // 2. 配置当前路径标签
        currentPathLabel.setStyle("-fx-font-weight: bold; -fx-font-size: 14px; -fx-text-fill: #495057;");
        currentPathLabel.setPadding(new Insets(5, 0, 5, 0));

        // 配置新建文件按钮
        newFileButton.setStyle("-fx-background-color: #28a745; -fx-text-fill: white; -fx-font-weight: bold;");
        newFileButton.setPadding(new Insets(5, 15, 5, 15));
        newFileButton.setOnMouseEntered(e -> newFileButton.setStyle("-fx-background-color: #218838; -fx-text-fill: white; -fx-font-weight: bold;"));
        newFileButton.setOnMouseExited(e -> newFileButton.setStyle("-fx-background-color: #28a745; -fx-text-fill: white; -fx-font-weight: bold;"));
        //newFileButton.setOnAction(e -> fileManager.createFile("新建文件.txt"));

        // 3. 配置磁盘监视按钮
        monitorButton.setStyle("-fx-background-color: #6c757d; -fx-text-fill: white; -fx-font-weight: bold;");
        monitorButton.setPadding(new Insets(5, 15, 5, 15));

        // 添加按钮悬停效果
        monitorButton.setOnMouseEntered(e -> {
            monitorButton.setStyle("-fx-background-color: #5a6268; -fx-text-fill: white; -fx-font-weight: bold;");
        });

        monitorButton.setOnMouseExited(e -> {
            monitorButton.setStyle("-fx-background-color: #6c757d; -fx-text-fill: white; -fx-font-weight: bold;");
        });

        // 4. 创建弹簧区域，将按钮推到右边
        Region spacer = new Region();
        HBox.setHgrow(spacer, Priority.ALWAYS);

        // 5. 将所有组件添加到工具栏
        topToolBar.getChildren().addAll(currentPathLabel, spacer, monitorButton);

        return topToolBar;
    }

    private Pane createCenter() {
        // 1. 创建主容器 - 使用 BorderPane 来组织布局
        BorderPane centerPane = new BorderPane();

        // 2. 配置文件浏览器面板（移除了顶部的路径显示）
        fileBrowserPane.setPadding(new Insets(15));
        fileBrowserPane.setHgap(20);
        fileBrowserPane.setVgap(20);
        fileBrowserPane.setStyle("-fx-background-color: #f5f5f5;");

        // 3. 直接将文件浏览器面板设置为中心
        centerPane.setCenter(fileBrowserPane);

        // 4. 加载当前目录的内容（初始为根目录）
        refreshFileBrowser(Config.ROOT_BLOCK);

        return centerPane;
    }

    private void refreshFileBrowser(int directoryBlock) {
        try {
            // 1. 清空当前显示
            fileBrowserPane.getChildren().clear();

            // 2. 读取目录内容
            List<DirectoryEntry> entries = dm.readDirectoryEntries(directoryBlock);

            // 3. 遍历并创建每个项目的图形表示
            for (DirectoryEntry entry : entries) {
                if (!entry.isEmpty()) {
                    Pane itemPane = createFileItem(entry);
                    fileBrowserPane.getChildren().add(itemPane);
                }
            }

        } catch (IOException e) {
            e.printStackTrace();
            // 显示错误信息
            Label errorLabel = new Label("无法读取目录: " + e.getMessage());
            errorLabel.setStyle("-fx-text-fill: red; -fx-font-size: 16px;");
            fileBrowserPane.getChildren().add(errorLabel);
        }
    }

    private Pane createFileItem(DirectoryEntry entry) {
        // 1. 创建容器
        VBox itemBox = new VBox(5); // 5像素的垂直间距
        itemBox.setAlignment(Pos.TOP_CENTER);
        itemBox.setPadding(new Insets(10));
        itemBox.setPrefWidth(80);
        itemBox.setStyle("-fx-background-color: white; -fx-border-color: #ddd; -fx-border-radius: 5;");

        // 2. 创建图标（使用Unicode字符或后续可以替换为图片）
        Label iconLabel = new Label();
        if (entry.isDirectory()) {
            iconLabel.setText("📁"); // 文件夹图标
            iconLabel.setStyle("-fx-font-size: 24px;");
        } else {
            iconLabel.setText("📄"); // 文件图标
            iconLabel.setStyle("-fx-font-size: 24px;");
        }

        // 3. 创建名称标签
        String displayName = entry.getFileName();
        if (!entry.getFileType().isBlank()) {
            displayName += "." + entry.getFileType();
        }

        Label nameLabel = new Label(displayName);
        nameLabel.setMaxWidth(70);
        nameLabel.setWrapText(true);
        nameLabel.setAlignment(Pos.CENTER);
        nameLabel.setStyle("-fx-font-size: 12px; -fx-text-alignment: center;");

        // 4. 添加到容器
        itemBox.getChildren().addAll(iconLabel, nameLabel);

        // 5. 添加鼠标悬停效果
        itemBox.setOnMouseEntered(e -> {
            itemBox.setStyle("-fx-background-color: #e3f2fd; -fx-border-color: #2196f3; -fx-border-radius: 5;");
        });

        itemBox.setOnMouseExited(e -> {
            itemBox.setStyle("-fx-background-color: white; -fx-border-color: #ddd; -fx-border-radius: 5;");
        });

        return itemBox;
    }

    private Pane createLeft() {
        // 1. 创建一个标签作为标题
        Label titleLabel = new Label("目录树");
        titleLabel.setStyle("-fx-font-weight: bold; -fx-padding: 5;");

        // 2. 配置 TreeView
        directoryTreeView.setPrefWidth(250); // 设置一个合适的宽度
        directoryTreeView.setShowRoot(true); // 确保显示根节点

        // 3. 创建一个容器（VBox），将标签和树视图放入其中
        VBox leftPane = new VBox();
        VBox.setVgrow(directoryTreeView, Priority.ALWAYS);
        leftPane.getChildren().addAll(titleLabel, directoryTreeView);
        leftPane.setSpacing(5); // 设置组件间距
        leftPane.setPadding(new Insets(10)); // 设置内边距

        // 4. 最关键的一步：构建树的数据！
        //    我们先创建一个根节点，然后递归地添加子节点
        TreeItem<String> rootItem = buildTreeFromDisk();
        directoryTreeView.setRoot(rootItem);

        return leftPane;
    }

    private TreeItem<String> buildTreeFromDisk() {
        // 1. 创建树的根节点，代表整个磁盘的根目录
        TreeItem<String> rootTreeItem = new TreeItem<>("虚拟磁盘");
        rootTreeItem.setExpanded(true); // 默认展开根目录

        try {
            // 2. 从磁盘读取根目录块（假设根目录在块2）
            List<DirectoryEntry> rootEntries = dm.readDirectoryEntries(Config.ROOT_BLOCK);

            // 3. 遍历根目录的所有条目
            for (DirectoryEntry entry : rootEntries) {
                if (!entry.isEmpty()) {
                    // 4. 为每个条目创建一个树节点
                    TreeItem<String> childItem = createTreeItemForEntry(entry);
                    // 5. 将这个新节点添加到根节点下
                    rootTreeItem.getChildren().add(childItem);
                }
            }
        } catch (IOException e) {
            e.printStackTrace();
            // 处理异常，例如显示一个错误节点
            TreeItem<String> errorItem = new TreeItem<>("加载失败: " + e.getMessage());
            rootTreeItem.getChildren().add(errorItem);
        }

        return rootTreeItem;
    }

    private TreeItem<String> createTreeItemForEntry(DirectoryEntry entry) {
        // 生成节点的显示文本：文件名.类型
        String nodeName = entry.getFileName() +
                (entry.getFileType().isBlank() ? "" : "." + entry.getFileType());

        TreeItem<String> item = new TreeItem<>(nodeName);

        // 如果是目录，我们给它添加一个空的子节点作为占位符。
        // 这样旁边就会出现一个箭头，用户可以展开。
        // 真正的子项将在用户首次展开时动态加载（延迟加载，性能更好）
        if (entry.isDirectory()) {
            item.getChildren().add(new TreeItem<>("Loading..."));
            // 存储这个目录项的起始块号，以便后续展开时加载真实数据
            // 这里可以用 setValue 存储自定义对象，或者用 Map 关联。
            // 简单起见，我们先这样实现。
        }

        return item;
    }

    public BorderPane getRootPane() {
        return root;
    }

    public void updateCurrentPath(String path) {
        currentPathLabel.setText("当前位置: " + path);
    }


}
